package cn.hh.util;

import cn.hh.bean.R;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/*
 * gitee图床工具类
 *
 * */
@Slf4j
@Component
public class GiteeBucketUtil {

    /**
     * TODO：这个常量是码云为您分配的私人令牌，Token
     */
    @Value("${gitee.giteebucket.access-token}")
    private String ACCESS_TOKEN;


    /**
     * 仓库所属地址  这个是您的私人用户名 具体请参考创建仓库时的注意事项
     */
    @Value("${gitee.giteebucket.owner}")
    private  String OWNER;
    /**
     * TODO：仓库名称  这里是您的仓库名称
     */
    @Value("${gitee.giteebucket.repo-name}")
    private  String REPO_NAME;
    /**
     * TODO：上传图片的message
     */
    @Value("${gitee.giteebucket.create-repos-message}")
    private  String CREATE_REPOS_MESSAGE;
    /**
     * TODO：文件前缀   这里格式化咱们上传图片的路径，在img路劲下  以每天的日期为子文件夹，进行存储。 上传地址可以自定义。
     */
    private static final String IMG_FILE_DEST_PATH = "img/" + DateUtil.format(new Date(), "yyyy_MM_dd") + "/";


    /**
     * 新建文件
     * <p>
     * owner*   仓库所属空间地址(企业、组织或个人的地址path)
     * repo*    仓库路径
     * path*    文件的路径
     * content* 文件内容, 要用 base64 编码
     * message* 提交信息
     * <p>
     * %s =>仓库所属空间地址(企业、组织或个人的地址path)  (owner)
     * %s => 仓库路径(repo)
     * %s => 文件的路径(path)
     */
    private static final String CREATE_REPOS_URL = "https://gitee.com/api/v5/repos/%s/%s/contents/%s";


    public R uploadImg(MultipartFile file) throws IOException {
        if (ObjectUtils.isEmpty(file)) {
            R.ok("请重新上传！");
        }
        String trueFileName = file.getOriginalFilename();
        // 断言
        assert trueFileName != null;
        String suffix = trueFileName.substring(trueFileName.lastIndexOf("."));
        String fileName = System.currentTimeMillis() + "_" + IdUtil.randomUUID() + suffix;
        String paramImgFile = Base64.encode(file.getBytes());
        //转存到gitee
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("access_token", ACCESS_TOKEN);
        paramMap.put("message", CREATE_REPOS_MESSAGE + DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN));
        paramMap.put("content", paramImgFile);
        String targetDir = IMG_FILE_DEST_PATH + fileName;
        String requestUrl = String.format(CREATE_REPOS_URL, OWNER,
                REPO_NAME, targetDir);
        log.debug("requestUrl:"+requestUrl);
        log.debug("paramMap:"+JSONUtil.toJsonStr(requestUrl));
        String resultJson = HttpUtil.post(requestUrl, paramMap);
        JSONObject jsonObject = JSONUtil.parseObj(resultJson);
        if (jsonObject.getObj("commit") != null) {
            JSONObject content = jsonObject.getJSONObject("content");
            String download_url = content.getStr("download_url");
            return R.ok().put("url", download_url);
        } else {
            return R.error("上传失败！");
        }
    }

    public R uploadImg(File file) throws IOException {
        if (ObjectUtils.isEmpty(file)) {
            R.ok("请重新上传！");
        }
        String trueFileName = file.getName();
        // 断言
        assert trueFileName != null;
        String suffix = trueFileName.substring(trueFileName.lastIndexOf("."));
        String fileName = System.currentTimeMillis() + "_" + IdUtil.randomUUID() + suffix;
        String paramImgFile = Base64.encode(file);
        //转存到gitee
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("access_token", ACCESS_TOKEN);
        paramMap.put("message", CREATE_REPOS_MESSAGE + DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN));
        paramMap.put("content", paramImgFile);
        String targetDir = IMG_FILE_DEST_PATH + fileName;
        String requestUrl = String.format(CREATE_REPOS_URL, OWNER,
                REPO_NAME, targetDir);
        log.info("requestUrl:"+requestUrl);
        log.info("paramMap:"+JSONUtil.toJsonStr(paramMap));
        String resultJson = HttpUtil.post(requestUrl, paramMap);
        JSONObject jsonObject = JSONUtil.parseObj(resultJson);
        log.info("result:"+JSONUtil.toJsonStr(jsonObject));
        if (jsonObject.getObj("commit") != null) {
            JSONObject content = jsonObject.getJSONObject("content");
            String download_url = content.getStr("download_url");
            return R.ok().put("url", download_url);
        } else {
            return R.error("上传失败！");
        }
    }
}

